package models

import (
	"context"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo/options"
)

// UserBasic 用户基本信息结构体
type UserBasic struct {
	Identity  string `bson:"identity"`   // 用户唯一标识符
	Account   string `bson:"account"`    // 用户账号
	Password  string `bson:"password"`   // 用户密码（建议加密存储，如哈希）
	Nickname  string `bson:"nickname"`   // 用户昵称
	Sex       int    `bson:"sex"`        // 用户性别，通常 0 表示未知，1 表示男性，2 表示女性
	Email     string `bson:"email"`      // 用户邮箱地址
	Avatar    string `bson:"avatar"`     // 用户头像 URL
	CreatedAt int64  `bson:"created_at"` // 创建时间的时间戳（通常为 Unix 时间戳）
	UpdatedAt int64  `bson:"updated_at"` // 更新时间的时间戳（通常为 Unix 时间戳）
}

// 返回数据库相关表名
func (UserBasic) CollectionName() string {
	return "user_basic"
}

/*
获取用户信息
*/
// 通过账号密码获取用户信息
func GetUserBasicByAccountPassword(account, password string) (*UserBasic, error) {
	// 初始化一个UserBasic实例去存储结果
	ub := new(UserBasic)
	// 定义一个过滤器，用于查询数据
	filter := bson.D{
		{"account", account},
		{"password", password},
	}
	err := Mongo.Collection(UserBasic{}.CollectionName()).FindOne(context.Background(), filter).Decode(ub)
	return ub, err
}

// 通过用户ID获取用户信息
func GetUserBasicByIdentity(identity string) (*UserBasic, error) {
	// 初始化一个UserBasic实例去存储结果
	ub := new(UserBasic)
	// 定义一个过滤器，用于查询数据
	filter := bson.D{
		{"identity", identity},
	}
	err := Mongo.Collection(UserBasic{}.CollectionName()).FindOne(context.Background(), filter).Decode(ub)
	return ub, err
}

// 通过账号查询用户
func GetUserBasicByAccount(account string) (*UserBasic, error) {
	// 初始化一个UserBasic实例去存储结果
	ub := new(UserBasic)

	// 定义一个过滤器，用于查询数据
	filter := bson.D{
		{"account", account},
	}

	// 定义一个投影,指定需要返回的字段
	projection := bson.D{
		{"identity", 1},
		{"nickname", 1},
		{"sex", 1},
		{"email", 1},
		{"avatar", 1},
	}
	err := Mongo.Collection(UserBasic{}.CollectionName()).FindOne(context.Background(), filter, options.FindOne().SetProjection(projection)).Decode(ub)
	return ub, err
}

/*
用户唯一性校验
*/
// 通过用户的邮箱查校验
func GetUserBasicCountByEmail(email string) (int64, error) {
	filter := bson.D{
		{"email", email},
	}
	documents, err := Mongo.Collection(UserBasic{}.CollectionName()).CountDocuments(context.Background(), filter)
	return documents, err
}

// 通过用户账号校验
func GetUserBasicCountByAccount(account string) (int64, error) {
	filter := bson.D{
		{"account", account},
	}
	documents, err := Mongo.Collection(UserBasic{}.CollectionName()).CountDocuments(context.Background(), filter)
	return documents, err
}

/*
插入数据
*/
// 插入一个数据
func InsertOneUserBasic(ub *UserBasic) error {
	_, err := Mongo.Collection(UserBasic{}.CollectionName()).InsertOne(context.Background(), ub)
	return err
}

// 插入多个数据
func InsertManyUserBasic(ub []UserBasic) error {
	var docs []interface{}
	for _, user := range ub {
		docs = append(docs, user)
	}
	_, err := Mongo.Collection(UserBasic{}.CollectionName()).InsertMany(context.Background(), docs)
	return err
}
